	#include "stdafx.h"
	#define _WIN32_DCOM
	#include <iostream>
	using namespace std;
	#include <comdef.h>
	#include <Wbemidl.h>
	#include <conio.h>
#include <string>


	# pragma comment(lib, "wbemuuid.lib")

	BOOL ManageWMI();
	int main(int argc, char* argv[])
	{
		if(ManageWMI()) printf("%WMI Error!");
	 _getch(); 
	 return 0;
	}

	BOOL ManageWMI()
	{
		HRESULT hres;

		// Step 1: --------------------------------------------------
		// Initialize COM. ------------------------------------------

		hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
		if (FAILED(hres))
		{
			cout << "Failed to initialize COM library. Error code = 0x" 
				<< hex << hres << endl;
			return 1;                  // Program has failed.
		}
		cout << "step 1" << endl;
		// Step 2: --------------------------------------------------
		// Set general COM security levels --------------------------
		// Note: If you are using Windows 2000, you need to specify -
		// the default authentication credentials for a user by using
		// a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
		// parameter of CoInitializeSecurity ------------------------

		hres =  CoInitializeSecurity(
			NULL, 
			-1,                          // COM authentication
			NULL,                        // Authentication services
			NULL,                        // Reserved
			RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
			RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
			NULL,                        // Authentication info
			EOAC_NONE,                   // Additional capabilities 
			NULL                         // Reserved
			);

                      
		if (FAILED(hres))
		{
			cout << "Failed to initialize security. Error code = 0x" 
				<< hex << hres << endl;
			CoUninitialize();
			return 1;                    // Program has failed.
		}
    
		cout << "step 2 " << endl;
		// Step 3: ---------------------------------------------------
		// Obtain the initial locator to WMI -------------------------

		IWbemLocator *pLoc = NULL;

		hres = CoCreateInstance(
			CLSID_WbemLocator,             
			0, 
			CLSCTX_INPROC_SERVER, 
			IID_IWbemLocator, (LPVOID *) &pLoc);
 
		if (FAILED(hres))
		{
			cout << "Failed to create IWbemLocator object."
				<< " Err code = 0x"
				<< hex << hres << endl;
			CoUninitialize();
			return 1;                 // Program has failed.
		}
		cout << "step 3" << endl;
		// Step 4: -----------------------------------------------------
		// Connect to WMI through the IWbemLocator::ConnectServer method

		IWbemServices *pSvc = NULL;
 
		// Connect to the root/cimv2 namespace with
		// the current user and obtain pointer pSvc
		// to make IWbemServices calls.
		hres = pLoc->ConnectServer(
			 _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
			 NULL,                    // User name. NULL = current user
			 NULL,                    // User password. NULL = current
			 0,                       // Locale. NULL indicates current
			 NULL,                    // Security flags.
			 0,                       // Authority (e.g. Kerberos)
			 0,                       // Context object 
			 &pSvc                    // pointer to IWbemServices proxy
			 );

		switch(hres){
		case WBEM_E_ACCESS_DENIED:
			cout << "access denied"<< endl;
			break;
		case WBEM_E_FAILED:
			cout << "This indicates other unspecified errors." << endl;
			break;
		case  WBEM_E_INVALID_NAMESPACE:
			cout << "invalid namespace " << endl;
			break;
		case WBEM_E_INVALID_PARAMETER:
			cout << "invalid parameter" << endl;
			break;
		case WBEM_E_OUT_OF_MEMORY:
			cout << "out of memory" << endl;
			break;
		case WBEM_E_TRANSPORT_FAILURE:
			cout << "transport failure" << endl;
			break;
		case WBEM_E_LOCAL_CREDENTIALS:
			cout << "WMI is passing the user credential on local connection." << endl;
			break;
		default:
			cout << "success!"<<endl;
			break;
		}
    
		if (FAILED(hres))
		{
			cout << "Could not connect. Error code = 0x" 
				 << hex << hres << endl;
			pLoc->Release();     
			cout << "released!!" << endl;
			CoUninitialize();
			cout << "counitialized !!" << endl;
			return 1;                // Program has failed.
		}
		cout<< "step 4" << endl;
		cout << "Connected to ROOT//CIMV2 WMI namespace" << endl;


		// Step 5: --------------------------------------------------
		// Set security levels on the proxy -------------------------

		hres = CoSetProxyBlanket(
		   pSvc,                        // Indicates the proxy to set
		   RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
		   RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
		   NULL,                        // Server principal name 
		   RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
		   RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
		   NULL,                        // client identity
		   EOAC_NONE                    // proxy capabilities 
		);
		cout << "step 5" << endl;
		if (FAILED(hres))
		{
			cout << "Could not set proxy blanket. Error code = 0x" 
				<< hex << hres << endl;
			pSvc->Release();
			pLoc->Release();     
			CoUninitialize();
			return 1;               // Program has failed.
		}

		// Step 6: --------------------------------------------------
		// Use the IWbemServices pointer to make requests of WMI ----

		// For example, get the name of the operating system
		IEnumWbemClassObject* pEnumerator = NULL;
		hres = pSvc->ExecQuery(
			bstr_t("WQL"), 
			bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration "),
			WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
			NULL,
			&pEnumerator);
    
		if (FAILED(hres))
		{
			cout << "Query for Network Adapter Configuration failed."
				<< " Error code = 0x" 
				<< hex << hres << endl;
			pSvc->Release();
			pLoc->Release();
			CoUninitialize();
			return 1;               // Program has failed.
		}
		cout << "step 6" << endl;


		// Step 7: -------------------------------------------------
		// Get the data from the query in step 6 -------------------
 
		IWbemClassObject *pclsObj;
		ULONG uReturn = 0;
   
		while (pEnumerator)
		{
			HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
				&pclsObj, &uReturn);

			if(0 == uReturn)
			{
				break;
			}

			VARIANT vtProp;
	  VariantInit(&vtProp);

  
	  //hr = pclsObj->Get(L"IPSubnet", 0, &vtProp, 0, 0);
			// Get the value of the Enable property
	  hr = pclsObj->Get(L"IPEnabled", 0, &vtProp, 0, 0);
			// Get the value of the MacAddress property
	  if(vtProp.boolVal)
	  {
	   hr = pclsObj->Get(L"MacAddress", 0, &vtProp, 0, 0);
	   wcout << " MacAddress : " << vtProp.bstrVal << endl;
	  }
  
	  hr = pclsObj->Get(L"IPEnabled", 0, &vtProp, 0, 0);
	  if(vtProp.boolVal)
	  { 
	   LONG lstart, lend;
	   LONG idx = -1;
	   BSTR* pbstr;
	   SAFEARRAY *sa;
	   hr = pclsObj->Get(L"Description", 0, &vtProp, 0, 0);
	   if(!FAILED(hr))
	   {
		wcout << "Description: " << vtProp.bstrVal << endl; 
	   }
	   hr = pclsObj->Get(L"DNSHostName", 0, &vtProp, 0, 0);
	   if(!FAILED(hr))
	   {
		cout << "DNS:" << vtProp.bstrVal << endl;
	   }
	   hr = pclsObj->Get(L"IPAddress", 0, &vtProp, 0, 0);
	   if(!FAILED(hr))
	   {   
		SAFEARRAY *psa = vtProp.parray;
		cout << "IP Address::" << psa << endl;
	   }
	  }


			VariantClear(&vtProp);
		}




		wstring tmp = L"hello world!";
		_bstr_t bstr(tmp.c_str());
		string str(bstr);
		cout << str << endl;




		// Cleanup
		// ========
    
		pSvc->Release();
		pLoc->Release();
		pEnumerator->Release();
		pclsObj->Release();
		CoUninitialize();

		return 0;   // Program successfully completed.
 
	}